package br.com.werp.regras.tesouraria.controle;

import br.com.werp.regras.geral.Acesso;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.GerenciamentoDocumento;
import br.com.werp.regras.geral.GerenciamentoPessoa;
import br.com.werp.regras.geral.Relatorio;
import br.com.werp.regras.geral.Suporte;
import br.com.werp.regras.geral.helpers.TipoDocumentoHelper;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Html;
import br.com.werp.regras.geral.util.JRDataSourcePadrao;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.documento.DocumentoDominioVO;
import br.com.werp.regras.geral.vos.documento.DocumentoFinanceiroVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVencimentoPesquisaVO;
import br.com.werp.regras.geral.vos.documento.DocumentoVencimentoVO;
import br.com.werp.regras.geral.vos.relatorio.RelatorioVO;
import br.com.werp.regras.geral.vos.suporte.EmpresaVO;
import br.com.werp.regras.geral.vos.tabelas.Pessoa;
import br.com.werp.regras.geral.vos.tabelas.Tipo_documento;
import br.com.werp.regras.geral.vos.tabelas.Usuario;
import br.com.werp.regras.geral.vos.tesouraria.DocumentoVencimentoRelatorioFormVO;
import br.com.werp.regras.geral.vos.tesouraria.DocumentoVencimentoRelatorioVO;

import org.apache.commons.beanutils.BeanUtils;

import java.sql.Timestamp;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;


/**
 * @author Sobreira
 * Criado em 05/12/2006
 */
public class ControleVencimentoRelatorio {
    private ControleVencimentos controleVencimentos = new ControleVencimentos();

    public RelatorioVO gerarRelatorioVencimentos(Object form,
        String requisitor, String empresa) throws Exception {
        DocumentoVencimentoRelatorioFormVO documentoVencimentoRelatorioFormVO = new DocumentoVencimentoRelatorioFormVO();

        BeanUtil.copiarVO(form, documentoVencimentoRelatorioFormVO);

        Map parameters = BeanUtils.describe(form);

        if (!Html.checkBoxMarcado(
                    documentoVencimentoRelatorioFormVO.getDominio())) {
            Tipo_documento tipo_documento = TipoDocumentoHelper.obterTipo_documento(Util.zeroOuInt(
                        documentoVencimentoRelatorioFormVO.getTipo_documento()));

            parameters.put("tipo_documento", tipo_documento.getTdoc_descricao());
        } else {
            parameters.put("tipo_documento", "TODOS");
        }

        List listaRelatorio = processarRelatorioVencimentos(documentoVencimentoRelatorioFormVO,
                requisitor);
        Acesso acesso = FabricaSubSistema.getAcesso();
        Usuario usuario = new Usuario();
        usuario.setUsur_login(requisitor);

        usuario = (Usuario) Util.get0(acesso.pesquisarUsuarios(usuario));

        Suporte suporte = FabricaSubSistema.getSuporte();
        EmpresaVO empresaVO = new EmpresaVO();
        empresaVO.setEmpr_id(Util.zeroOuInt(empresa));

        empresaVO = (EmpresaVO) Util.get0(suporte.obterEmpresaVO(empresaVO));

        Relatorio relatorio = FabricaSubSistema.getRelatorio();
        parameters.put("empresa", empresaVO.getEmpr_descricao());
        parameters.put("usuario", usuario.getUsur_nome());
        parameters.put("data_relatorio",
            new Timestamp(System.currentTimeMillis()));
        parameters.put(Relatorio.IMAGE_URI, "/tesouraria/imgJasper/");

        return relatorio.processarRelatorio(new JRDataSourcePadrao(
                listaRelatorio), "RelatorioVencimentos",
            documentoVencimentoRelatorioFormVO.getTipo_relatorio(), parameters,
            FabricaSubSistema.getTesouraria(), new HashMap(), new HashMap());
    }

    private List processarRelatorioVencimentos(
        DocumentoVencimentoRelatorioFormVO documentoVencimentoRelatorioFormVO,
        String requisitor) throws Exception {
        GerenciamentoDocumento gerenciamentoDocumento = FabricaSubSistema.getGerenciamentoDocumento();
        DocumentoVencimentoPesquisaVO documentoVencimentoPesquisaVO = new DocumentoVencimentoPesquisaVO();
        documentoVencimentoPesquisaVO.setDocm_pessoa(Util.zeroOuInt(
                documentoVencimentoRelatorioFormVO.getForn_pessoa()));
        documentoVencimentoPesquisaVO.setDcve_valor(Util.convercaoMonetaria(
                documentoVencimentoRelatorioFormVO.getValor_documento()));

        List listaVencimentos = gerenciamentoDocumento.pesquisarVencimentosVO(documentoVencimentoRelatorioFormVO.getVenc_inicio(),
                documentoVencimentoRelatorioFormVO.getVenc_fim(),
                documentoVencimentoPesquisaVO);

        controleVencimentos.verificarVencimentosPagos(listaVencimentos);

        GerenciamentoPessoa gerenciamentoPessoa = FabricaSubSistema.getGerenciamentoPessoa();

        List retorno = new LinkedList();

        for (Iterator iter = listaVencimentos.iterator(); iter.hasNext();) {
            DocumentoVencimentoVO vencimento = (DocumentoVencimentoVO) iter.next();

            Pessoa pessoa = new Pessoa();

            pessoa.setPess_id(vencimento.getDocm_pessoa());

            pessoa = (Pessoa) Util.get0(gerenciamentoPessoa.obterPessoa(pessoa));

            DocumentoVencimentoRelatorioVO documentoVencimentoRelatorioVO = new DocumentoVencimentoRelatorioVO();

            documentoVencimentoRelatorioVO.setFornecedor(pessoa.getPess_nome());

            documentoVencimentoRelatorioVO.setValor(vencimento.getDcve_valor());

            if (vencimento instanceof DocumentoVencimentoVO) {
                int docm_id = gerenciamentoDocumento.obeterDocumentoRaiz(vencimento.getDocm_id());

                DocumentoFinanceiroVO documentoFinanceiroVO = new DocumentoFinanceiroVO();
                documentoFinanceiroVO.setDocm_id(docm_id);

                documentoFinanceiroVO = (DocumentoFinanceiroVO) Util.get0(gerenciamentoDocumento.obeterDocumentoFinanceiroVO(
                            documentoFinanceiroVO));

                if (!Util.isNullOrEmpty(
                            documentoVencimentoRelatorioFormVO.getDocumento())) {
                    documentoFinanceiroVO.setDcfi_numero_emissor(documentoVencimentoRelatorioFormVO.getDocumento());
                }

                if (Html.checkBoxMarcado(
                            documentoVencimentoRelatorioFormVO.getDominio())) {
                    DocumentoDominioVO dominioVO = new DocumentoDominioVO();
                    int dominioSelecionado = Util.zeroOuInt(documentoVencimentoRelatorioFormVO.getDominioCombo());
                    dominioVO.setTdoc_id(documentoFinanceiroVO.getDocm_tipo());

                    List dominios = gerenciamentoDocumento.pesquisarDocumentoDominioVO(dominioVO);
                    dominioVO = (DocumentoDominioVO) Util.get0(dominios);

                    if (dominioSelecionado != dominioVO.getDomi_id()) {
                        continue;
                    }
                } else {
                    int tipo_documeto = Util.zeroOuInt(documentoVencimentoRelatorioFormVO.getTipo_documento());

                    if (documentoFinanceiroVO.getDocm_tipo() != tipo_documeto) {
                        continue;
                    }
                }

                int numParcela = gerenciamentoDocumento.obterNumeroParcelaVencimento(documentoFinanceiroVO,
                        vencimento);
                List parcelas = gerenciamentoDocumento.obterVencimentos(docm_id);
                double valDocumento = 0;

                for (Iterator iterator = parcelas.iterator();
                        iterator.hasNext();) {
                    DocumentoVencimentoVO element = (DocumentoVencimentoVO) iterator.next();
                    valDocumento += element.getDcve_valor();
                }

                documentoVencimentoRelatorioVO.setValDocumento(valDocumento);

                int totParcelcas = parcelas.size();
                documentoVencimentoRelatorioVO.setParcela(numParcela + "/" +
                    totParcelcas);

                documentoVencimentoRelatorioVO.setNumero(documentoFinanceiroVO.getDcfi_numero_emissor());
            }

            documentoVencimentoRelatorioVO.setVencimento(vencimento.getDcve_data());

            retorno.add(documentoVencimentoRelatorioVO);
        }

        Collections.sort(retorno,
            new Comparator() {
                public int compare(Object o1, Object o2) {
                    DocumentoVencimentoRelatorioVO rel1 = (DocumentoVencimentoRelatorioVO) o1;
                    DocumentoVencimentoRelatorioVO rel2 = (DocumentoVencimentoRelatorioVO) o2;

                    return rel1.getVencimento().compareTo(rel2.getVencimento());
                }
            });

        return retorno;
    }

    public static void main(String[] argr) throws Exception {
        ControleVencimentoRelatorio controleVencimentoRelatorio = new ControleVencimentoRelatorio();
        DocumentoVencimentoRelatorioFormVO documentoVencimentoRelatorioFormVO = new DocumentoVencimentoRelatorioFormVO();

        documentoVencimentoRelatorioFormVO.setTipo_relatorio(Relatorio.TIPO_HTML);

        Util.verRelartorio(controleVencimentoRelatorio.gerarRelatorioVencimentos(
                documentoVencimentoRelatorioFormVO, "", ""));
    }
}
